#coding: utf-8

require 'socket'
require './paques.rb'

TAILLE_TAMPON = 256
CODE_OK       = "100 "
CODE_NOK      = "200 "

$jours = %w(dimanche lundi mardi mercredi jeudi vendredi samedi)
$mois  = %w(janvier fevrier mars avril mai juin juillet aout septembre \
              octobre novembre decembre)  

def convert(date) # Convertit un date en chaine fr
  return date.day.to_s + " " +
         $mois[date.mon - 1] + " " +
         date.year.to_s  
end

begin
  # Vérification de la ligne de commande de l'appel
  raise "\nUsage: #{$0} <port>\n" if ARGV.length != 1

  # Création de la socket de réception
  sock = UDPSocket.new
  
  # Ouverture en ecriture du fichier log
  $log = File.open("#{$0}.log", "w")
  $log.puts "[#{Time.now}] Lancement du serveur"
  
  # Mise en place d'un gestionnaire pour capturer SIGINT
  trap("SIGINT") do
      sock.close
      sock = nil   # pour le ensure
      $log.puts "[#{Time.now}] Arrêt du serveur"
      $log.close
      exit 0
  end
  
  # Liaison de la socket au port (sur toutes les adresses)
  sock.bind("", ARGV[0])
  $log.puts "[#{Time.now}] Serveur en attente sur le port #{ARGV[0]}"

  # Boucle d'attente d'un datagramme
  loop do
    # Attente d'un requête
    requete = sock.recvfrom(TAILLE_TAMPON)

    raise "Erreur recvfrom()...\n" if requete.length < 0

    message, sockClient = requete
    ipClient = sockClient[3]
    portClient = sockClient[1]    

    $log.puts("[#{Time.now}] Requete #{message.upcase} de #{ipClient}")
    
    # Création de la réponse
    reponse = CODE_OK
    case message.upcase
      when "DATE"
        reponse += convert(Time.now)
      when "JOUR"
        reponse += $jours[Time.now.wday]
      when "MOIS"
        reponse += $mois[Time.now.month - 1] 
      when "ANNEE"
        reponse += Time.now.year.to_s
      when "HEURE"
        reponse += Time.now.hour.to_s + ":" + Time.now.min.to_s + 
                                        ":" + Time.now.sec.to_s
      when "PAQUES"
        reponse += convert(paques(Time.now.year))
      when "ASCENSION"
        reponse += convert(paques(Time.now.year) + 39)
      else
        reponse = CODE_NOK + "Requete incorrecte : #{message}"
    end # case

    # Envoi de la réponse
    sock.send(reponse, 0, ipClient, portClient)

  end # loop

rescue Exception => e
  STDERR.puts e
ensure
  sock.close if sock
  $log.close if $log and not $log.closed?
end



